// 思路，双指针思路，left和right分别指向首尾索引，判断首尾元素是否相等，动态改变索引

function isPalindrome(str) {
    str = str.replace(/[^a-zA-Z0-9]/g, '').replace(/\s/g, '').toLowerCase()
    let left = 0
    let right = str.length - 1
    while (left < right) {
        if (str[left] === str[right]) {
            left++
            right--
        } else {
            return false
        }
    }
    return true
}

let str = 'A man, a plan, a canal: Panama'
console.log(isPalindrome(str));


// 给定一个非空字符串 s，最多删除一个字符。判断是否能成为回文字符串
// 输入: "abca"
// 输出: True
// 解释: 你可以删除c字符
const validPalindrome = function(s) {
    // 缓存字符串的长度
    const len = s.length

    // i、j分别为左右指针
    let i=0, j=len-1
    
    // 当左右指针均满足对称时，一起向中间前进
    while(i<j&&s[i]===s[j]) {
        i++ 
        j--
    }
    
    // 尝试判断跳过左指针元素后字符串是否回文
    if(isPalindrome(i+1,j)) {
      return true
    }
    // 尝试判断跳过右指针元素后字符串是否回文
    if(isPalindrome(i,j-1)) {
        return true
    }
    
    // 工具方法，用于判断字符串是否回文
    function isPalindrome(st, ed) {
        while(st<ed) {
            if(s[st] !== s[ed]) {
                return false
            }
            st++
            ed--
        } 
        return true
    }
    
    // 默认返回 false
    return false 
};

console.log(validPalindrome('aca'))
